home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
FM Towns: Free Software Collection 4
/
FM Towns Free Software Collection 4 - Disc 1.iso
/
msdos
/
mituyama
/
mituyama.c
next >
Wrap
C/C++ Source or Header
|
1991-10-18
|
5KB
|
221 lines
/************************************/
/******* 三山 くずし *******/
/*** Copyright (C) 1991.H.Asano ***/
/* programming 1991.3.21 */
/************************************/
#define locate(x,y) printf("\x1b[%d;%dH",(x),(y))
#define CLRLINE "\x1b[K"
#define CLRATLIB "\x1b[m"
#define CURSOLOFF "\x1b[1v"
#define CURSOLON "\x1b[0v"
#define CONTINUE 1
#define COMWIN 2
#define MANWIN 3
#define STONE_POS 17
static struct {
int su[3]; /* 山の石の数 */
int su_info[3] ; /* 山の印字位置 */
int iro[3]; /* 石の色 */
int get; /* 石を取る山 */
} yama = {{0,0,0},{5,31,57},{32,33,36}};
main()
{
int init(void);
int getstone(int);
void sleep(int);
int turn;
int kekka;
turn=init();
do {
kekka=getstone(turn);
turn=!turn;
sleep(1200);
} while(kekka==CONTINUE);
locate(6,22),printf(CLRLINE);
if(kekka == COMWIN)
printf("\x1b[5mやっぱり私が勝っただろう!\n");
else
printf("\x1b[33m珍しいこともあるものだ。君が勝つとは!!\n");
locate(21,1),printf(CLRATLIB),printf(CURSOLON);
}
int init(void)
{
int get_rand(int);
long now;
int i,j;
int x;
char turn;
printf("\x1b*\x1b[35m");
printf(" ★★★★ 不思議な 石 取 り あ そ び ★★★★\n");
printf(" [Ver1.0] Copyright (C) H.Asano 1991\n\n");
printf(CLRATLIB);
printf(" 最後の石を取った方が勝ちだよ。多分君は私に勝てないだろうが挑戦したまえ。\n");
srand(time(&now));
for(i=0;i<3;i++)
yama.su[i] = get_rand(75)+25;
for(i=0;i<3;i++) {
locate(STONE_POS,yama.su_info[i]);
printf(" %c 山 %3d個", 'A'+i, yama.su[i]);
printf("\x1b[%dm",yama.iro[i]);
x = STONE_POS - 2;
locate(x,yama.su_info[i]);
for(j=1;j<=yama.su[i];j++) {
printf("●");
if(j%10 == 0 ) locate(--x,yama.su_info[i]);
}
printf(CLRATLIB);
}
/**** 先攻 後攻を決める *****/
do {
locate(20,3),printf(CLRLINE);
printf("どちらが先に石を取るかい");
printf("\t0.私 \t1.君 ....... ?");
} while((turn=getch()) != '0' && turn != '1');
printf(" %c\n",turn);
return((int)(turn-'0'));
}
/***** 石の取り合い ****/
int getstone(int turn)
{
int com(void);
int man(void);
if(turn==0) return(com());
else return(man());
}
/**** 私が石をとります ****/
int com()
{
void prtstone(int where,int save,int getsu);
int save;
int x,y;
locate(19,1),printf(CLRLINE);
locate(20,1),printf(CLRLINE);
locate(19,1);
printf("私の番だな。");
if(yama.su[0] > yama.su[1] )
if(yama.su[0] > yama.su[2]) yama.get = 0;
else yama.get = 2;
else
if(yama.su[1] > yama.su[2]) yama.get = 1;
else yama.get = 2;
save = yama.su[yama.get];
if(!(yama.su[0] ^ yama.su[1] ^ yama.su[2]))
yama.su[yama.get]--;
else
do {
yama.su[yama.get]--;
if(yama.su[yama.get] < 0) {
yama.su[yama.get] = save;
yama.get += 1;
if(yama.get == 3) yama.get = 0;
save = yama.su[yama.get];
continue;
}
} while((yama.su[0] ^ yama.su[1] ^ yama.su[2]));
prtstone(yama.get,save,save-yama.su[yama.get]);
if(yama.su[0] + yama.su[1] + yama.su[2] == 0) return(COMWIN);
else return(CONTINUE);
}
/**** 人間が石を取ります ****/
int man()
{
int save;
int getsu;
char ch;
locate(19,1), printf(CLRLINE);
locate(20,1), printf(CLRLINE);
locate(19,1);
printf("君の番だ。");
printf(CURSOLON);
do {
do {
locate(20,3),printf(CLRLINE);
printf("どの山から取るかい ?");
} while(((ch=getch()) <'A' || ch > 'C') && (ch < 'a' || ch > 'c')) ;
yama.get = ch-1 & 0x0f;
printf(" %c\n",yama.get+'A');
if(yama.su[yama.get] != 0) break;
} while(1);
do {
locate(20,3),printf(CLRLINE);
printf("%c 山からいくつ取るつもり (1 ~ %d)? ",
yama.get+'A', yama.su[yama.get]);
scanf("%d",&getsu);
} while(0>=getsu || getsu>yama.su[yama.get]);
save = yama.su[yama.get];
yama.su[yama.get] -= getsu;
prtstone(yama.get, save, getsu);
if(yama.su[0] + yama.su[1] + yama.su[2] == 0) return(MANWIN);
else return(CONTINUE);
}
void prtstone(int where,int save,int getsu)
{
int i;
locate(20,3),printf(CLRLINE),printf(CURSOLOFF);
printf("%c 山から %d 個取るよ。\n",
'A'+yama.get,getsu);
for(i=1;i<=getsu;i++) {
locate(STONE_POS-2-(save-1)/10, yama.su_info[where]+(save-1)%10*2);
printf("\a ");
locate(STONE_POS,yama.su_info[where]+9);
printf("%3d",--save);
sleep(350);
}
}
void sleep(int count)
{
int i,j;
int a=0;
for(i=0;i<count;i++)
for(j=0;j<100;j++)
a=a*a*a*a;
}
int get_rand(int max)
{
int temp;
do {
temp = rand() / (32767/max);
} while(temp > max);
return(temp);
}